home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / xml / dom / minidom.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  60KB  |  2,077 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import xml.dom as xml
  5. from xml.dom import EMPTY_NAMESPACE, EMPTY_PREFIX, XMLNS_NAMESPACE, domreg
  6. from xml.dom.minicompat import *
  7. from xml.dom.xmlbuilder import DOMImplementationLS, DocumentLS
  8. _nodeTypes_with_children = (xml.dom.Node.ELEMENT_NODE, xml.dom.Node.ENTITY_REFERENCE_NODE)
  9.  
  10. class Node(xml.dom.Node):
  11.     namespaceURI = None
  12.     parentNode = None
  13.     ownerDocument = None
  14.     nextSibling = None
  15.     previousSibling = None
  16.     prefix = EMPTY_PREFIX
  17.     
  18.     def __nonzero__(self):
  19.         return True
  20.  
  21.     
  22.     def toxml(self, encoding = None):
  23.         return self.toprettyxml('', '', encoding)
  24.  
  25.     
  26.     def toprettyxml(self, indent = '\t', newl = '\n', encoding = None):
  27.         writer = _get_StringIO()
  28.         if encoding is not None:
  29.             import codecs as codecs
  30.             writer = codecs.lookup(encoding)[3](writer)
  31.         
  32.         if self.nodeType == Node.DOCUMENT_NODE:
  33.             self.writexml(writer, '', indent, newl, encoding)
  34.         else:
  35.             self.writexml(writer, '', indent, newl)
  36.         return writer.getvalue()
  37.  
  38.     
  39.     def hasChildNodes(self):
  40.         if self.childNodes:
  41.             return True
  42.         else:
  43.             return False
  44.  
  45.     
  46.     def _get_childNodes(self):
  47.         return self.childNodes
  48.  
  49.     
  50.     def _get_firstChild(self):
  51.         if self.childNodes:
  52.             return self.childNodes[0]
  53.         
  54.  
  55.     
  56.     def _get_lastChild(self):
  57.         if self.childNodes:
  58.             return self.childNodes[-1]
  59.         
  60.  
  61.     
  62.     def insertBefore(self, newChild, refChild):
  63.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  64.             for c in tuple(newChild.childNodes):
  65.                 self.insertBefore(c, refChild)
  66.             
  67.             return newChild
  68.         
  69.         if newChild.nodeType not in self._child_node_types:
  70.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  71.         
  72.         if newChild.parentNode is not None:
  73.             newChild.parentNode.removeChild(newChild)
  74.         
  75.         if refChild is None:
  76.             self.appendChild(newChild)
  77.         else:
  78.             
  79.             try:
  80.                 index = self.childNodes.index(refChild)
  81.             except ValueError:
  82.                 raise xml.dom.NotFoundErr()
  83.  
  84.             if newChild.nodeType in _nodeTypes_with_children:
  85.                 _clear_id_cache(self)
  86.             
  87.             self.childNodes.insert(index, newChild)
  88.             newChild.nextSibling = refChild
  89.             refChild.previousSibling = newChild
  90.             if index:
  91.                 node = self.childNodes[index - 1]
  92.                 node.nextSibling = newChild
  93.                 newChild.previousSibling = node
  94.             else:
  95.                 newChild.previousSibling = None
  96.             newChild.parentNode = self
  97.         return newChild
  98.  
  99.     
  100.     def appendChild(self, node):
  101.         if node.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  102.             for c in tuple(node.childNodes):
  103.                 self.appendChild(c)
  104.             
  105.             return node
  106.         
  107.         if node.nodeType not in self._child_node_types:
  108.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  109.         elif node.nodeType in _nodeTypes_with_children:
  110.             _clear_id_cache(self)
  111.         
  112.         if node.parentNode is not None:
  113.             node.parentNode.removeChild(node)
  114.         
  115.         _append_child(self, node)
  116.         node.nextSibling = None
  117.         return node
  118.  
  119.     
  120.     def replaceChild(self, newChild, oldChild):
  121.         if newChild.nodeType == self.DOCUMENT_FRAGMENT_NODE:
  122.             refChild = oldChild.nextSibling
  123.             self.removeChild(oldChild)
  124.             return self.insertBefore(newChild, refChild)
  125.         
  126.         if newChild.nodeType not in self._child_node_types:
  127.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(newChild), repr(self)))
  128.         
  129.         if newChild is oldChild:
  130.             return None
  131.         
  132.         if newChild.parentNode is not None:
  133.             newChild.parentNode.removeChild(newChild)
  134.         
  135.         
  136.         try:
  137.             index = self.childNodes.index(oldChild)
  138.         except ValueError:
  139.             raise xml.dom.NotFoundErr()
  140.  
  141.         self.childNodes[index] = newChild
  142.         newChild.parentNode = self
  143.         oldChild.parentNode = None
  144.         if newChild.nodeType in _nodeTypes_with_children or oldChild.nodeType in _nodeTypes_with_children:
  145.             _clear_id_cache(self)
  146.         
  147.         newChild.nextSibling = oldChild.nextSibling
  148.         newChild.previousSibling = oldChild.previousSibling
  149.         oldChild.nextSibling = None
  150.         oldChild.previousSibling = None
  151.         if newChild.previousSibling:
  152.             newChild.previousSibling.nextSibling = newChild
  153.         
  154.         if newChild.nextSibling:
  155.             newChild.nextSibling.previousSibling = newChild
  156.         
  157.         return oldChild
  158.  
  159.     
  160.     def removeChild(self, oldChild):
  161.         
  162.         try:
  163.             self.childNodes.remove(oldChild)
  164.         except ValueError:
  165.             raise xml.dom.NotFoundErr()
  166.  
  167.         if oldChild.nextSibling is not None:
  168.             oldChild.nextSibling.previousSibling = oldChild.previousSibling
  169.         
  170.         if oldChild.previousSibling is not None:
  171.             oldChild.previousSibling.nextSibling = oldChild.nextSibling
  172.         
  173.         oldChild.nextSibling = None
  174.         oldChild.previousSibling = None
  175.         if oldChild.nodeType in _nodeTypes_with_children:
  176.             _clear_id_cache(self)
  177.         
  178.         oldChild.parentNode = None
  179.         return oldChild
  180.  
  181.     
  182.     def normalize(self):
  183.         L = []
  184.         for child in self.childNodes:
  185.             if child.nodeType == Node.TEXT_NODE:
  186.                 data = child.data
  187.                 if data and L and L[-1].nodeType == child.nodeType:
  188.                     node = L[-1]
  189.                     node.data = node.data + child.data
  190.                     node.nextSibling = child.nextSibling
  191.                     child.unlink()
  192.                 elif data:
  193.                     if L:
  194.                         L[-1].nextSibling = child
  195.                         child.previousSibling = L[-1]
  196.                     else:
  197.                         child.previousSibling = None
  198.                     L.append(child)
  199.                 else:
  200.                     child.unlink()
  201.             L[-1].nodeType == child.nodeType
  202.             if L:
  203.                 L[-1].nextSibling = child
  204.                 child.previousSibling = L[-1]
  205.             else:
  206.                 child.previousSibling = None
  207.             L.append(child)
  208.             if child.nodeType == Node.ELEMENT_NODE:
  209.                 child.normalize()
  210.                 continue
  211.         
  212.         if L:
  213.             L[-1].nextSibling = None
  214.         
  215.         self.childNodes[:] = L
  216.  
  217.     
  218.     def cloneNode(self, deep):
  219.         if not self.ownerDocument:
  220.             pass
  221.         return _clone_node(self, deep, self)
  222.  
  223.     
  224.     def isSupported(self, feature, version):
  225.         return self.ownerDocument.implementation.hasFeature(feature, version)
  226.  
  227.     
  228.     def _get_localName(self):
  229.         pass
  230.  
  231.     
  232.     def isSameNode(self, other):
  233.         return self is other
  234.  
  235.     
  236.     def getInterface(self, feature):
  237.         if self.isSupported(feature, None):
  238.             return self
  239.         else:
  240.             return None
  241.  
  242.     
  243.     def getUserData(self, key):
  244.         
  245.         try:
  246.             return self._user_data[key][0]
  247.         except (AttributeError, KeyError):
  248.             return None
  249.  
  250.  
  251.     
  252.     def setUserData(self, key, data, handler):
  253.         old = None
  254.         
  255.         try:
  256.             d = self._user_data
  257.         except AttributeError:
  258.             d = { }
  259.             self._user_data = d
  260.  
  261.         if d.has_key(key):
  262.             old = d[key][0]
  263.         
  264.         if data is None:
  265.             handler = None
  266.             if old is not None:
  267.                 del d[key]
  268.             
  269.         else:
  270.             d[key] = (data, handler)
  271.         return old
  272.  
  273.     
  274.     def _call_user_data_handler(self, operation, src, dst):
  275.         if hasattr(self, '_user_data'):
  276.             for data, handler in self._user_data.items():
  277.                 if handler is not None:
  278.                     handler.handle(operation, key, data, src, dst)
  279.                     continue
  280.             
  281.         
  282.  
  283.     
  284.     def unlink(self):
  285.         self.parentNode = None
  286.         self.ownerDocument = None
  287.         if self.childNodes:
  288.             for child in self.childNodes:
  289.                 child.unlink()
  290.             
  291.             self.childNodes = NodeList()
  292.         
  293.         self.previousSibling = None
  294.         self.nextSibling = None
  295.  
  296.  
  297. defproperty(Node, 'firstChild', doc = 'First child node, or None.')
  298. defproperty(Node, 'lastChild', doc = 'Last child node, or None.')
  299. defproperty(Node, 'localName', doc = 'Namespace-local name of this node.')
  300.  
  301. def _append_child(self, node):
  302.     childNodes = self.childNodes
  303.     if childNodes:
  304.         last = childNodes[-1]
  305.         node.__dict__['previousSibling'] = last
  306.         last.__dict__['nextSibling'] = node
  307.     
  308.     childNodes.append(node)
  309.     node.__dict__['parentNode'] = self
  310.  
  311.  
  312. def _in_document(node):
  313.     while node is not None:
  314.         if node.nodeType == Node.DOCUMENT_NODE:
  315.             return True
  316.         
  317.         node = node.parentNode
  318.     return False
  319.  
  320.  
  321. def _write_data(writer, data):
  322.     data = data.replace('&', '&').replace('<', '<')
  323.     data = data.replace('"', '"').replace('>', '>')
  324.     writer.write(data)
  325.  
  326.  
  327. def _get_elements_by_tagName_helper(parent, name, rc):
  328.     for node in parent.childNodes:
  329.         if node.nodeType == Node.ELEMENT_NODE:
  330.             if name == '*' or node.tagName == name:
  331.                 rc.append(node)
  332.             
  333.         _get_elements_by_tagName_helper(node, name, rc)
  334.     
  335.     return rc
  336.  
  337.  
  338. def _get_elements_by_tagName_ns_helper(parent, nsURI, localName, rc):
  339.     for node in parent.childNodes:
  340.         if node.nodeType == Node.ELEMENT_NODE:
  341.             if localName == '*' or node.localName == localName:
  342.                 if nsURI == '*' or node.namespaceURI == nsURI:
  343.                     rc.append(node)
  344.                 
  345.             _get_elements_by_tagName_ns_helper(node, nsURI, localName, rc)
  346.             continue
  347.     
  348.     return rc
  349.  
  350.  
  351. class DocumentFragment(Node):
  352.     nodeType = Node.DOCUMENT_FRAGMENT_NODE
  353.     nodeName = '#document-fragment'
  354.     nodeValue = None
  355.     attributes = None
  356.     parentNode = None
  357.     _child_node_types = (Node.ELEMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.NOTATION_NODE)
  358.     
  359.     def __init__(self):
  360.         self.childNodes = NodeList()
  361.  
  362.  
  363.  
  364. class Attr(Node):
  365.     nodeType = Node.ATTRIBUTE_NODE
  366.     attributes = None
  367.     ownerElement = None
  368.     specified = False
  369.     _is_id = False
  370.     _child_node_types = (Node.TEXT_NODE, Node.ENTITY_REFERENCE_NODE)
  371.     
  372.     def __init__(self, qName, namespaceURI = EMPTY_NAMESPACE, localName = None, prefix = None):
  373.         d = self.__dict__
  374.         d['nodeName'] = d['name'] = qName
  375.         d['namespaceURI'] = namespaceURI
  376.         d['prefix'] = prefix
  377.         d['childNodes'] = NodeList()
  378.         self.childNodes.append(Text())
  379.  
  380.     
  381.     def _get_localName(self):
  382.         return self.nodeName.split(':', 1)[-1]
  383.  
  384.     
  385.     def _get_name(self):
  386.         return self.name
  387.  
  388.     
  389.     def _get_specified(self):
  390.         return self.specified
  391.  
  392.     
  393.     def __setattr__(self, name, value):
  394.         d = self.__dict__
  395.         if name in ('value', 'nodeValue'):
  396.             d['value'] = d['nodeValue'] = value
  397.             d2 = self.childNodes[0].__dict__
  398.             d2['data'] = d2['nodeValue'] = value
  399.             if self.ownerElement is not None:
  400.                 _clear_id_cache(self.ownerElement)
  401.             
  402.         elif name in ('name', 'nodeName'):
  403.             d['name'] = d['nodeName'] = value
  404.             if self.ownerElement is not None:
  405.                 _clear_id_cache(self.ownerElement)
  406.             
  407.         else:
  408.             d[name] = value
  409.  
  410.     
  411.     def _set_prefix(self, prefix):
  412.         nsuri = self.namespaceURI
  413.         if prefix == 'xmlns':
  414.             if nsuri and nsuri != XMLNS_NAMESPACE:
  415.                 raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix for the wrong namespace")
  416.             
  417.         
  418.         d = self.__dict__
  419.         d['prefix'] = prefix
  420.         if prefix is None:
  421.             newName = self.localName
  422.         else:
  423.             newName = '%s:%s' % (prefix, self.localName)
  424.         if self.ownerElement:
  425.             _clear_id_cache(self.ownerElement)
  426.         
  427.         d['nodeName'] = d['name'] = newName
  428.  
  429.     
  430.     def _set_value(self, value):
  431.         d = self.__dict__
  432.         d['value'] = d['nodeValue'] = value
  433.         if self.ownerElement:
  434.             _clear_id_cache(self.ownerElement)
  435.         
  436.         self.childNodes[0].data = value
  437.  
  438.     
  439.     def unlink(self):
  440.         elem = self.ownerElement
  441.         if elem is not None:
  442.             del elem._attrs[self.nodeName]
  443.             del elem._attrsNS[(self.namespaceURI, self.localName)]
  444.             if self._is_id:
  445.                 self._is_id = False
  446.                 elem._magic_id_nodes -= 1
  447.                 self.ownerDocument._magic_id_count -= 1
  448.             
  449.         
  450.         for child in self.childNodes:
  451.             child.unlink()
  452.         
  453.         del self.childNodes[:]
  454.  
  455.     
  456.     def _get_isId(self):
  457.         if self._is_id:
  458.             return True
  459.         
  460.         doc = self.ownerDocument
  461.         elem = self.ownerElement
  462.         if doc is None or elem is None:
  463.             return False
  464.         
  465.         info = doc._get_elem_info(elem)
  466.         if info is None:
  467.             return False
  468.         
  469.         if self.namespaceURI:
  470.             return info.isIdNS(self.namespaceURI, self.localName)
  471.         else:
  472.             return info.isId(self.nodeName)
  473.  
  474.     
  475.     def _get_schemaType(self):
  476.         doc = self.ownerDocument
  477.         elem = self.ownerElement
  478.         if doc is None or elem is None:
  479.             return _no_type
  480.         
  481.         info = doc._get_elem_info(elem)
  482.         if info is None:
  483.             return _no_type
  484.         
  485.         if self.namespaceURI:
  486.             return info.getAttributeTypeNS(self.namespaceURI, self.localName)
  487.         else:
  488.             return info.getAttributeType(self.nodeName)
  489.  
  490.  
  491. defproperty(Attr, 'isId', doc = 'True if this attribute is an ID.')
  492. defproperty(Attr, 'localName', doc = 'Namespace-local name of this attribute.')
  493. defproperty(Attr, 'schemaType', doc = 'Schema type for this attribute.')
  494.  
  495. class NamedNodeMap(object):
  496.     __slots__ = ('_attrs', '_attrsNS', '_ownerElement')
  497.     
  498.     def __init__(self, attrs, attrsNS, ownerElement):
  499.         self._attrs = attrs
  500.         self._attrsNS = attrsNS
  501.         self._ownerElement = ownerElement
  502.  
  503.     
  504.     def _get_length(self):
  505.         return len(self._attrs)
  506.  
  507.     
  508.     def item(self, index):
  509.         
  510.         try:
  511.             return self[self._attrs.keys()[index]]
  512.         except IndexError:
  513.             return None
  514.  
  515.  
  516.     
  517.     def items(self):
  518.         L = []
  519.         for node in self._attrs.values():
  520.             L.append((node.nodeName, node.value))
  521.         
  522.         return L
  523.  
  524.     
  525.     def itemsNS(self):
  526.         L = []
  527.         for node in self._attrs.values():
  528.             L.append(((node.namespaceURI, node.localName), node.value))
  529.         
  530.         return L
  531.  
  532.     
  533.     def has_key(self, key):
  534.         if isinstance(key, StringTypes):
  535.             return self._attrs.has_key(key)
  536.         else:
  537.             return self._attrsNS.has_key(key)
  538.  
  539.     
  540.     def keys(self):
  541.         return self._attrs.keys()
  542.  
  543.     
  544.     def keysNS(self):
  545.         return self._attrsNS.keys()
  546.  
  547.     
  548.     def values(self):
  549.         return self._attrs.values()
  550.  
  551.     
  552.     def get(self, name, value = None):
  553.         return self._attrs.get(name, value)
  554.  
  555.     __len__ = _get_length
  556.     
  557.     def __cmp__(self, other):
  558.         if self._attrs is getattr(other, '_attrs', None):
  559.             return 0
  560.         else:
  561.             return cmp(id(self), id(other))
  562.  
  563.     
  564.     def __getitem__(self, attname_or_tuple):
  565.         if isinstance(attname_or_tuple, tuple):
  566.             return self._attrsNS[attname_or_tuple]
  567.         else:
  568.             return self._attrs[attname_or_tuple]
  569.  
  570.     
  571.     def __setitem__(self, attname, value):
  572.         if isinstance(value, StringTypes):
  573.             
  574.             try:
  575.                 node = self._attrs[attname]
  576.             except KeyError:
  577.                 node = Attr(attname)
  578.                 node.ownerDocument = self._ownerElement.ownerDocument
  579.                 self.setNamedItem(node)
  580.  
  581.             node.value = value
  582.         elif not isinstance(value, Attr):
  583.             raise TypeError, 'value must be a string or Attr object'
  584.         
  585.         node = value
  586.         self.setNamedItem(node)
  587.  
  588.     
  589.     def getNamedItem(self, name):
  590.         
  591.         try:
  592.             return self._attrs[name]
  593.         except KeyError:
  594.             return None
  595.  
  596.  
  597.     
  598.     def getNamedItemNS(self, namespaceURI, localName):
  599.         
  600.         try:
  601.             return self._attrsNS[(namespaceURI, localName)]
  602.         except KeyError:
  603.             return None
  604.  
  605.  
  606.     
  607.     def removeNamedItem(self, name):
  608.         n = self.getNamedItem(name)
  609.         if n is not None:
  610.             _clear_id_cache(self._ownerElement)
  611.             del self._attrs[n.nodeName]
  612.             del self._attrsNS[(n.namespaceURI, n.localName)]
  613.             if n.__dict__.has_key('ownerElement'):
  614.                 n.__dict__['ownerElement'] = None
  615.             
  616.             return n
  617.         else:
  618.             raise xml.dom.NotFoundErr()
  619.  
  620.     
  621.     def removeNamedItemNS(self, namespaceURI, localName):
  622.         n = self.getNamedItemNS(namespaceURI, localName)
  623.         if n is not None:
  624.             _clear_id_cache(self._ownerElement)
  625.             del self._attrsNS[(n.namespaceURI, n.localName)]
  626.             del self._attrs[n.nodeName]
  627.             if n.__dict__.has_key('ownerElement'):
  628.                 n.__dict__['ownerElement'] = None
  629.             
  630.             return n
  631.         else:
  632.             raise xml.dom.NotFoundErr()
  633.  
  634.     
  635.     def setNamedItem(self, node):
  636.         if not isinstance(node, Attr):
  637.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  638.         
  639.         old = self._attrs.get(node.name)
  640.         if old:
  641.             old.unlink()
  642.         
  643.         self._attrs[node.name] = node
  644.         self._attrsNS[(node.namespaceURI, node.localName)] = node
  645.         node.ownerElement = self._ownerElement
  646.         _clear_id_cache(node.ownerElement)
  647.         return old
  648.  
  649.     
  650.     def setNamedItemNS(self, node):
  651.         return self.setNamedItem(node)
  652.  
  653.     
  654.     def __delitem__(self, attname_or_tuple):
  655.         node = self[attname_or_tuple]
  656.         _clear_id_cache(node.ownerElement)
  657.         node.unlink()
  658.  
  659.     
  660.     def __getstate__(self):
  661.         return (self._attrs, self._attrsNS, self._ownerElement)
  662.  
  663.     
  664.     def __setstate__(self, state):
  665.         (self._attrs, self._attrsNS, self._ownerElement) = state
  666.  
  667.  
  668. defproperty(NamedNodeMap, 'length', doc = 'Number of nodes in the NamedNodeMap.')
  669. AttributeList = NamedNodeMap
  670.  
  671. class TypeInfo(object):
  672.     __slots__ = ('namespace', 'name')
  673.     
  674.     def __init__(self, namespace, name):
  675.         self.namespace = namespace
  676.         self.name = name
  677.  
  678.     
  679.     def __repr__(self):
  680.         if self.namespace:
  681.             return '<TypeInfo %r (from %r)>' % (self.name, self.namespace)
  682.         else:
  683.             return '<TypeInfo %r>' % self.name
  684.  
  685.     
  686.     def _get_name(self):
  687.         return self.name
  688.  
  689.     
  690.     def _get_namespace(self):
  691.         return self.namespace
  692.  
  693.  
  694. _no_type = TypeInfo(None, None)
  695.  
  696. class Element(Node):
  697.     nodeType = Node.ELEMENT_NODE
  698.     nodeValue = None
  699.     schemaType = _no_type
  700.     _magic_id_nodes = 0
  701.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.TEXT_NODE, Node.CDATA_SECTION_NODE, Node.ENTITY_REFERENCE_NODE)
  702.     
  703.     def __init__(self, tagName, namespaceURI = EMPTY_NAMESPACE, prefix = None, localName = None):
  704.         self.tagName = self.nodeName = tagName
  705.         self.prefix = prefix
  706.         self.namespaceURI = namespaceURI
  707.         self.childNodes = NodeList()
  708.         self._attrs = { }
  709.         self._attrsNS = { }
  710.  
  711.     
  712.     def _get_localName(self):
  713.         return self.tagName.split(':', 1)[-1]
  714.  
  715.     
  716.     def _get_tagName(self):
  717.         return self.tagName
  718.  
  719.     
  720.     def unlink(self):
  721.         for attr in self._attrs.values():
  722.             attr.unlink()
  723.         
  724.         self._attrs = None
  725.         self._attrsNS = None
  726.         Node.unlink(self)
  727.  
  728.     
  729.     def getAttribute(self, attname):
  730.         
  731.         try:
  732.             return self._attrs[attname].value
  733.         except KeyError:
  734.             return ''
  735.  
  736.  
  737.     
  738.     def getAttributeNS(self, namespaceURI, localName):
  739.         
  740.         try:
  741.             return self._attrsNS[(namespaceURI, localName)].value
  742.         except KeyError:
  743.             return ''
  744.  
  745.  
  746.     
  747.     def setAttribute(self, attname, value):
  748.         attr = self.getAttributeNode(attname)
  749.         if attr is None:
  750.             attr = Attr(attname)
  751.             d = attr.__dict__
  752.             d['value'] = d['nodeValue'] = value
  753.             d['ownerDocument'] = self.ownerDocument
  754.             self.setAttributeNode(attr)
  755.         elif value != attr.value:
  756.             d = attr.__dict__
  757.             d['value'] = d['nodeValue'] = value
  758.             if attr.isId:
  759.                 _clear_id_cache(self)
  760.             
  761.         
  762.  
  763.     
  764.     def setAttributeNS(self, namespaceURI, qualifiedName, value):
  765.         (prefix, localname) = _nssplit(qualifiedName)
  766.         attr = self.getAttributeNodeNS(namespaceURI, localname)
  767.         if attr is None:
  768.             attr = Attr(qualifiedName, namespaceURI, localname, prefix)
  769.             d = attr.__dict__
  770.             d['prefix'] = prefix
  771.             d['nodeName'] = qualifiedName
  772.             d['value'] = d['nodeValue'] = value
  773.             d['ownerDocument'] = self.ownerDocument
  774.             self.setAttributeNode(attr)
  775.         else:
  776.             d = attr.__dict__
  777.             if value != attr.value:
  778.                 d['value'] = d['nodeValue'] = value
  779.                 if attr.isId:
  780.                     _clear_id_cache(self)
  781.                 
  782.             
  783.             if attr.prefix != prefix:
  784.                 d['prefix'] = prefix
  785.                 d['nodeName'] = qualifiedName
  786.             
  787.  
  788.     
  789.     def getAttributeNode(self, attrname):
  790.         return self._attrs.get(attrname)
  791.  
  792.     
  793.     def getAttributeNodeNS(self, namespaceURI, localName):
  794.         return self._attrsNS.get((namespaceURI, localName))
  795.  
  796.     
  797.     def setAttributeNode(self, attr):
  798.         if attr.ownerElement not in (None, self):
  799.             raise xml.dom.InuseAttributeErr('attribute node already owned')
  800.         
  801.         old1 = self._attrs.get(attr.name, None)
  802.         if old1 is not None:
  803.             self.removeAttributeNode(old1)
  804.         
  805.         old2 = self._attrsNS.get((attr.namespaceURI, attr.localName), None)
  806.         if old2 is not None and old2 is not old1:
  807.             self.removeAttributeNode(old2)
  808.         
  809.         _set_attribute_node(self, attr)
  810.         if old1 is not attr:
  811.             return old1
  812.         
  813.         if old2 is not attr:
  814.             return old2
  815.         
  816.  
  817.     setAttributeNodeNS = setAttributeNode
  818.     
  819.     def removeAttribute(self, name):
  820.         
  821.         try:
  822.             attr = self._attrs[name]
  823.         except KeyError:
  824.             raise xml.dom.NotFoundErr()
  825.  
  826.         self.removeAttributeNode(attr)
  827.  
  828.     
  829.     def removeAttributeNS(self, namespaceURI, localName):
  830.         
  831.         try:
  832.             attr = self._attrsNS[(namespaceURI, localName)]
  833.         except KeyError:
  834.             raise xml.dom.NotFoundErr()
  835.  
  836.         self.removeAttributeNode(attr)
  837.  
  838.     
  839.     def removeAttributeNode(self, node):
  840.         if node is None:
  841.             raise xml.dom.NotFoundErr()
  842.         
  843.         
  844.         try:
  845.             self._attrs[node.name]
  846.         except KeyError:
  847.             raise xml.dom.NotFoundErr()
  848.  
  849.         _clear_id_cache(self)
  850.         node.unlink()
  851.         node.ownerDocument = self.ownerDocument
  852.  
  853.     removeAttributeNodeNS = removeAttributeNode
  854.     
  855.     def hasAttribute(self, name):
  856.         return self._attrs.has_key(name)
  857.  
  858.     
  859.     def hasAttributeNS(self, namespaceURI, localName):
  860.         return self._attrsNS.has_key((namespaceURI, localName))
  861.  
  862.     
  863.     def getElementsByTagName(self, name):
  864.         return _get_elements_by_tagName_helper(self, name, NodeList())
  865.  
  866.     
  867.     def getElementsByTagNameNS(self, namespaceURI, localName):
  868.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  869.  
  870.     
  871.     def __repr__(self):
  872.         return '<DOM Element: %s at %#x>' % (self.tagName, id(self))
  873.  
  874.     
  875.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  876.         writer.write(indent + '<' + self.tagName)
  877.         attrs = self._get_attributes()
  878.         a_names = attrs.keys()
  879.         a_names.sort()
  880.         for a_name in a_names:
  881.             writer.write(' %s="' % a_name)
  882.             _write_data(writer, attrs[a_name].value)
  883.             writer.write('"')
  884.         
  885.         if self.childNodes:
  886.             writer.write('>%s' % newl)
  887.             for node in self.childNodes:
  888.                 node.writexml(writer, indent + addindent, addindent, newl)
  889.             
  890.             writer.write('%s</%s>%s' % (indent, self.tagName, newl))
  891.         else:
  892.             writer.write('/>%s' % newl)
  893.  
  894.     
  895.     def _get_attributes(self):
  896.         return NamedNodeMap(self._attrs, self._attrsNS, self)
  897.  
  898.     
  899.     def hasAttributes(self):
  900.         if self._attrs:
  901.             return True
  902.         else:
  903.             return False
  904.  
  905.     
  906.     def setIdAttribute(self, name):
  907.         idAttr = self.getAttributeNode(name)
  908.         self.setIdAttributeNode(idAttr)
  909.  
  910.     
  911.     def setIdAttributeNS(self, namespaceURI, localName):
  912.         idAttr = self.getAttributeNodeNS(namespaceURI, localName)
  913.         self.setIdAttributeNode(idAttr)
  914.  
  915.     
  916.     def setIdAttributeNode(self, idAttr):
  917.         if idAttr is None or not self.isSameNode(idAttr.ownerElement):
  918.             raise xml.dom.NotFoundErr()
  919.         
  920.         if _get_containing_entref(self) is not None:
  921.             raise xml.dom.NoModificationAllowedErr()
  922.         
  923.  
  924.  
  925. defproperty(Element, 'attributes', doc = 'NamedNodeMap of attributes on the element.')
  926. defproperty(Element, 'localName', doc = 'Namespace-local name of this element.')
  927.  
  928. def _set_attribute_node(element, attr):
  929.     _clear_id_cache(element)
  930.     element._attrs[attr.name] = attr
  931.     element._attrsNS[(attr.namespaceURI, attr.localName)] = attr
  932.     attr.__dict__['ownerElement'] = element
  933.  
  934.  
  935. class Childless:
  936.     attributes = None
  937.     childNodes = EmptyNodeList()
  938.     firstChild = None
  939.     lastChild = None
  940.     
  941.     def _get_firstChild(self):
  942.         pass
  943.  
  944.     
  945.     def _get_lastChild(self):
  946.         pass
  947.  
  948.     
  949.     def appendChild(self, node):
  950.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes cannot have children')
  951.  
  952.     
  953.     def hasChildNodes(self):
  954.         return False
  955.  
  956.     
  957.     def insertBefore(self, newChild, refChild):
  958.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  959.  
  960.     
  961.     def removeChild(self, oldChild):
  962.         raise xml.dom.NotFoundErr(self.nodeName + ' nodes do not have children')
  963.  
  964.     
  965.     def replaceChild(self, newChild, oldChild):
  966.         raise xml.dom.HierarchyRequestErr(self.nodeName + ' nodes do not have children')
  967.  
  968.  
  969.  
  970. class ProcessingInstruction(Childless, Node):
  971.     nodeType = Node.PROCESSING_INSTRUCTION_NODE
  972.     
  973.     def __init__(self, target, data):
  974.         self.target = self.nodeName = target
  975.         self.data = self.nodeValue = data
  976.  
  977.     
  978.     def _get_data(self):
  979.         return self.data
  980.  
  981.     
  982.     def _set_data(self, value):
  983.         d = self.__dict__
  984.         d['data'] = d['nodeValue'] = value
  985.  
  986.     
  987.     def _get_target(self):
  988.         return self.target
  989.  
  990.     
  991.     def _set_target(self, value):
  992.         d = self.__dict__
  993.         d['target'] = d['nodeName'] = value
  994.  
  995.     
  996.     def __setattr__(self, name, value):
  997.         if name == 'data' or name == 'nodeValue':
  998.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  999.         elif name == 'target' or name == 'nodeName':
  1000.             self.__dict__['target'] = self.__dict__['nodeName'] = value
  1001.         else:
  1002.             self.__dict__[name] = value
  1003.  
  1004.     
  1005.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1006.         writer.write('%s<?%s %s?>%s' % (indent, self.target, self.data, newl))
  1007.  
  1008.  
  1009.  
  1010. class CharacterData(Childless, Node):
  1011.     
  1012.     def _get_length(self):
  1013.         return len(self.data)
  1014.  
  1015.     __len__ = _get_length
  1016.     
  1017.     def _get_data(self):
  1018.         return self.__dict__['data']
  1019.  
  1020.     
  1021.     def _set_data(self, data):
  1022.         d = self.__dict__
  1023.         d['data'] = d['nodeValue'] = data
  1024.  
  1025.     _get_nodeValue = _get_data
  1026.     _set_nodeValue = _set_data
  1027.     
  1028.     def __setattr__(self, name, value):
  1029.         if name == 'data' or name == 'nodeValue':
  1030.             self.__dict__['data'] = self.__dict__['nodeValue'] = value
  1031.         else:
  1032.             self.__dict__[name] = value
  1033.  
  1034.     
  1035.     def __repr__(self):
  1036.         data = self.data
  1037.         if len(data) > 10:
  1038.             dotdotdot = '...'
  1039.         else:
  1040.             dotdotdot = ''
  1041.         return '<DOM %s node "%s%s">' % (self.__class__.__name__, data[0:10], dotdotdot)
  1042.  
  1043.     
  1044.     def substringData(self, offset, count):
  1045.         if offset < 0:
  1046.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1047.         
  1048.         if offset >= len(self.data):
  1049.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1050.         
  1051.         if count < 0:
  1052.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1053.         
  1054.         return self.data[offset:offset + count]
  1055.  
  1056.     
  1057.     def appendData(self, arg):
  1058.         self.data = self.data + arg
  1059.  
  1060.     
  1061.     def insertData(self, offset, arg):
  1062.         if offset < 0:
  1063.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1064.         
  1065.         if offset >= len(self.data):
  1066.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1067.         
  1068.         if arg:
  1069.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset:])
  1070.         
  1071.  
  1072.     
  1073.     def deleteData(self, offset, count):
  1074.         if offset < 0:
  1075.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1076.         
  1077.         if offset >= len(self.data):
  1078.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1079.         
  1080.         if count < 0:
  1081.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1082.         
  1083.         if count:
  1084.             self.data = self.data[:offset] + self.data[offset + count:]
  1085.         
  1086.  
  1087.     
  1088.     def replaceData(self, offset, count, arg):
  1089.         if offset < 0:
  1090.             raise xml.dom.IndexSizeErr('offset cannot be negative')
  1091.         
  1092.         if offset >= len(self.data):
  1093.             raise xml.dom.IndexSizeErr('offset cannot be beyond end of data')
  1094.         
  1095.         if count < 0:
  1096.             raise xml.dom.IndexSizeErr('count cannot be negative')
  1097.         
  1098.         if count:
  1099.             self.data = '%s%s%s' % (self.data[:offset], arg, self.data[offset + count:])
  1100.         
  1101.  
  1102.  
  1103. defproperty(CharacterData, 'length', doc = 'Length of the string data.')
  1104.  
  1105. class Text(CharacterData):
  1106.     nodeType = Node.TEXT_NODE
  1107.     nodeName = '#text'
  1108.     attributes = None
  1109.     
  1110.     def splitText(self, offset):
  1111.         if offset < 0 or offset > len(self.data):
  1112.             raise xml.dom.IndexSizeErr('illegal offset value')
  1113.         
  1114.         newText = self.__class__()
  1115.         newText.data = self.data[offset:]
  1116.         newText.ownerDocument = self.ownerDocument
  1117.         next = self.nextSibling
  1118.         if self.parentNode and self in self.parentNode.childNodes:
  1119.             if next is None:
  1120.                 self.parentNode.appendChild(newText)
  1121.             else:
  1122.                 self.parentNode.insertBefore(newText, next)
  1123.         
  1124.         self.data = self.data[:offset]
  1125.         return newText
  1126.  
  1127.     
  1128.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1129.         _write_data(writer, '%s%s%s' % (indent, self.data, newl))
  1130.  
  1131.     
  1132.     def _get_wholeText(self):
  1133.         L = [
  1134.             self.data]
  1135.         n = self.previousSibling
  1136.         while n is not None:
  1137.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1138.                 L.insert(0, n.data)
  1139.                 n = n.previousSibling
  1140.                 continue
  1141.             break
  1142.         n = self.nextSibling
  1143.         while n is not None:
  1144.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1145.                 L.append(n.data)
  1146.                 n = n.nextSibling
  1147.                 continue
  1148.             break
  1149.         return ''.join(L)
  1150.  
  1151.     
  1152.     def replaceWholeText(self, content):
  1153.         parent = self.parentNode
  1154.         n = self.previousSibling
  1155.         while n is not None:
  1156.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1157.                 next = n.previousSibling
  1158.                 parent.removeChild(n)
  1159.                 n = next
  1160.                 continue
  1161.             break
  1162.         n = self.nextSibling
  1163.         if not content:
  1164.             parent.removeChild(self)
  1165.         
  1166.         while n is not None:
  1167.             if n.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
  1168.                 next = n.nextSibling
  1169.                 parent.removeChild(n)
  1170.                 n = next
  1171.                 continue
  1172.             break
  1173.         if content:
  1174.             d = self.__dict__
  1175.             d['data'] = content
  1176.             d['nodeValue'] = content
  1177.             return self
  1178.         else:
  1179.             return None
  1180.  
  1181.     
  1182.     def _get_isWhitespaceInElementContent(self):
  1183.         if self.data.strip():
  1184.             return False
  1185.         
  1186.         elem = _get_containing_element(self)
  1187.         if elem is None:
  1188.             return False
  1189.         
  1190.         info = self.ownerDocument._get_elem_info(elem)
  1191.         if info is None:
  1192.             return False
  1193.         else:
  1194.             return info.isElementContent()
  1195.  
  1196.  
  1197. defproperty(Text, 'isWhitespaceInElementContent', doc = 'True iff this text node contains only whitespace and is in element content.')
  1198. defproperty(Text, 'wholeText', doc = 'The text of all logically-adjacent text nodes.')
  1199.  
  1200. def _get_containing_element(node):
  1201.     c = node.parentNode
  1202.     while c is not None:
  1203.         if c.nodeType == Node.ELEMENT_NODE:
  1204.             return c
  1205.         
  1206.         c = c.parentNode
  1207.  
  1208.  
  1209. def _get_containing_entref(node):
  1210.     c = node.parentNode
  1211.     while c is not None:
  1212.         if c.nodeType == Node.ENTITY_REFERENCE_NODE:
  1213.             return c
  1214.         
  1215.         c = c.parentNode
  1216.  
  1217.  
  1218. class Comment(Childless, CharacterData):
  1219.     nodeType = Node.COMMENT_NODE
  1220.     nodeName = '#comment'
  1221.     
  1222.     def __init__(self, data):
  1223.         self.data = self.nodeValue = data
  1224.  
  1225.     
  1226.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1227.         writer.write('%s<!--%s-->%s' % (indent, self.data, newl))
  1228.  
  1229.  
  1230.  
  1231. class CDATASection(Text):
  1232.     nodeType = Node.CDATA_SECTION_NODE
  1233.     nodeName = '#cdata-section'
  1234.     
  1235.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1236.         if self.data.find(']]>') >= 0:
  1237.             raise ValueError("']]>' not allowed in a CDATA section")
  1238.         
  1239.         writer.write('<![CDATA[%s]]>' % self.data)
  1240.  
  1241.  
  1242.  
  1243. class ReadOnlySequentialNamedNodeMap(object):
  1244.     __slots__ = ('_seq',)
  1245.     
  1246.     def __init__(self, seq = ()):
  1247.         self._seq = seq
  1248.  
  1249.     
  1250.     def __len__(self):
  1251.         return len(self._seq)
  1252.  
  1253.     
  1254.     def _get_length(self):
  1255.         return len(self._seq)
  1256.  
  1257.     
  1258.     def getNamedItem(self, name):
  1259.         for n in self._seq:
  1260.             if n.nodeName == name:
  1261.                 return n
  1262.                 continue
  1263.         
  1264.  
  1265.     
  1266.     def getNamedItemNS(self, namespaceURI, localName):
  1267.         for n in self._seq:
  1268.             if n.namespaceURI == namespaceURI and n.localName == localName:
  1269.                 return n
  1270.                 continue
  1271.         
  1272.  
  1273.     
  1274.     def __getitem__(self, name_or_tuple):
  1275.         if isinstance(name_or_tuple, tuple):
  1276.             node = self.getNamedItemNS(*name_or_tuple)
  1277.         else:
  1278.             node = self.getNamedItem(name_or_tuple)
  1279.         if node is None:
  1280.             raise KeyError, name_or_tuple
  1281.         
  1282.         return node
  1283.  
  1284.     
  1285.     def item(self, index):
  1286.         if index < 0:
  1287.             return None
  1288.         
  1289.         
  1290.         try:
  1291.             return self._seq[index]
  1292.         except IndexError:
  1293.             return None
  1294.  
  1295.  
  1296.     
  1297.     def removeNamedItem(self, name):
  1298.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1299.  
  1300.     
  1301.     def removeNamedItemNS(self, namespaceURI, localName):
  1302.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1303.  
  1304.     
  1305.     def setNamedItem(self, node):
  1306.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1307.  
  1308.     
  1309.     def setNamedItemNS(self, node):
  1310.         raise xml.dom.NoModificationAllowedErr('NamedNodeMap instance is read-only')
  1311.  
  1312.     
  1313.     def __getstate__(self):
  1314.         return [
  1315.             self._seq]
  1316.  
  1317.     
  1318.     def __setstate__(self, state):
  1319.         self._seq = state[0]
  1320.  
  1321.  
  1322. defproperty(ReadOnlySequentialNamedNodeMap, 'length', doc = 'Number of entries in the NamedNodeMap.')
  1323.  
  1324. class Identified:
  1325.     
  1326.     def _identified_mixin_init(self, publicId, systemId):
  1327.         self.publicId = publicId
  1328.         self.systemId = systemId
  1329.  
  1330.     
  1331.     def _get_publicId(self):
  1332.         return self.publicId
  1333.  
  1334.     
  1335.     def _get_systemId(self):
  1336.         return self.systemId
  1337.  
  1338.  
  1339.  
  1340. class DocumentType(Identified, Childless, Node):
  1341.     nodeType = Node.DOCUMENT_TYPE_NODE
  1342.     nodeValue = None
  1343.     name = None
  1344.     publicId = None
  1345.     systemId = None
  1346.     internalSubset = None
  1347.     
  1348.     def __init__(self, qualifiedName):
  1349.         self.entities = ReadOnlySequentialNamedNodeMap()
  1350.         self.notations = ReadOnlySequentialNamedNodeMap()
  1351.         if qualifiedName:
  1352.             (prefix, localname) = _nssplit(qualifiedName)
  1353.             self.name = localname
  1354.         
  1355.         self.nodeName = self.name
  1356.  
  1357.     
  1358.     def _get_internalSubset(self):
  1359.         return self.internalSubset
  1360.  
  1361.     
  1362.     def cloneNode(self, deep):
  1363.         if self.ownerDocument is None:
  1364.             clone = DocumentType(None)
  1365.             clone.name = self.name
  1366.             clone.nodeName = self.name
  1367.             operation = xml.dom.UserDataHandler.NODE_CLONED
  1368.             if deep:
  1369.                 clone.entities._seq = []
  1370.                 clone.notations._seq = []
  1371.                 for n in self.notations._seq:
  1372.                     notation = Notation(n.nodeName, n.publicId, n.systemId)
  1373.                     clone.notations._seq.append(notation)
  1374.                     n._call_user_data_handler(operation, n, notation)
  1375.                 
  1376.                 for e in self.entities._seq:
  1377.                     entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  1378.                     entity.actualEncoding = e.actualEncoding
  1379.                     entity.encoding = e.encoding
  1380.                     entity.version = e.version
  1381.                     clone.entities._seq.append(entity)
  1382.                     e._call_user_data_handler(operation, n, entity)
  1383.                 
  1384.             
  1385.             self._call_user_data_handler(operation, self, clone)
  1386.             return clone
  1387.         else:
  1388.             return None
  1389.  
  1390.     
  1391.     def writexml(self, writer, indent = '', addindent = '', newl = ''):
  1392.         writer.write('<!DOCTYPE ')
  1393.         writer.write(self.name)
  1394.         if self.publicId:
  1395.             writer.write("%s  PUBLIC '%s'%s  '%s'" % (newl, self.publicId, newl, self.systemId))
  1396.         elif self.systemId:
  1397.             writer.write("%s  SYSTEM '%s'" % (newl, self.systemId))
  1398.         
  1399.         if self.internalSubset is not None:
  1400.             writer.write(' [')
  1401.             writer.write(self.internalSubset)
  1402.             writer.write(']')
  1403.         
  1404.         writer.write('>' + newl)
  1405.  
  1406.  
  1407.  
  1408. class Entity(Identified, Node):
  1409.     attributes = None
  1410.     nodeType = Node.ENTITY_NODE
  1411.     nodeValue = None
  1412.     actualEncoding = None
  1413.     encoding = None
  1414.     version = None
  1415.     
  1416.     def __init__(self, name, publicId, systemId, notation):
  1417.         self.nodeName = name
  1418.         self.notationName = notation
  1419.         self.childNodes = NodeList()
  1420.         self._identified_mixin_init(publicId, systemId)
  1421.  
  1422.     
  1423.     def _get_actualEncoding(self):
  1424.         return self.actualEncoding
  1425.  
  1426.     
  1427.     def _get_encoding(self):
  1428.         return self.encoding
  1429.  
  1430.     
  1431.     def _get_version(self):
  1432.         return self.version
  1433.  
  1434.     
  1435.     def appendChild(self, newChild):
  1436.         raise xml.dom.HierarchyRequestErr('cannot append children to an entity node')
  1437.  
  1438.     
  1439.     def insertBefore(self, newChild, refChild):
  1440.         raise xml.dom.HierarchyRequestErr('cannot insert children below an entity node')
  1441.  
  1442.     
  1443.     def removeChild(self, oldChild):
  1444.         raise xml.dom.HierarchyRequestErr('cannot remove children from an entity node')
  1445.  
  1446.     
  1447.     def replaceChild(self, newChild, oldChild):
  1448.         raise xml.dom.HierarchyRequestErr('cannot replace children of an entity node')
  1449.  
  1450.  
  1451.  
  1452. class Notation(Identified, Childless, Node):
  1453.     nodeType = Node.NOTATION_NODE
  1454.     nodeValue = None
  1455.     
  1456.     def __init__(self, name, publicId, systemId):
  1457.         self.nodeName = name
  1458.         self._identified_mixin_init(publicId, systemId)
  1459.  
  1460.  
  1461.  
  1462. class DOMImplementation(DOMImplementationLS):
  1463.     _features = [
  1464.         ('core', '1.0'),
  1465.         ('core', '2.0'),
  1466.         ('core', '3.0'),
  1467.         ('core', None),
  1468.         ('xml', '1.0'),
  1469.         ('xml', '2.0'),
  1470.         ('xml', '3.0'),
  1471.         ('xml', None),
  1472.         ('ls-load', '3.0'),
  1473.         ('ls-load', None)]
  1474.     
  1475.     def hasFeature(self, feature, version):
  1476.         if version == '':
  1477.             version = None
  1478.         
  1479.         return (feature.lower(), version) in self._features
  1480.  
  1481.     
  1482.     def createDocument(self, namespaceURI, qualifiedName, doctype):
  1483.         if doctype and doctype.parentNode is not None:
  1484.             raise xml.dom.WrongDocumentErr('doctype object owned by another DOM tree')
  1485.         
  1486.         doc = self._create_document()
  1487.         if namespaceURI is None and qualifiedName is None:
  1488.             pass
  1489.         add_root_element = not (doctype is None)
  1490.         if not qualifiedName and add_root_element:
  1491.             raise xml.dom.InvalidCharacterErr('Element with no name')
  1492.         
  1493.         if add_root_element:
  1494.             (prefix, localname) = _nssplit(qualifiedName)
  1495.             if prefix == 'xml' and namespaceURI != 'http://www.w3.org/XML/1998/namespace':
  1496.                 raise xml.dom.NamespaceErr("illegal use of 'xml' prefix")
  1497.             
  1498.             if prefix and not namespaceURI:
  1499.                 raise xml.dom.NamespaceErr('illegal use of prefix without namespaces')
  1500.             
  1501.             element = doc.createElementNS(namespaceURI, qualifiedName)
  1502.             if doctype:
  1503.                 doc.appendChild(doctype)
  1504.             
  1505.             doc.appendChild(element)
  1506.         
  1507.         if doctype:
  1508.             doctype.parentNode = doctype.ownerDocument = doc
  1509.         
  1510.         doc.doctype = doctype
  1511.         doc.implementation = self
  1512.         return doc
  1513.  
  1514.     
  1515.     def createDocumentType(self, qualifiedName, publicId, systemId):
  1516.         doctype = DocumentType(qualifiedName)
  1517.         doctype.publicId = publicId
  1518.         doctype.systemId = systemId
  1519.         return doctype
  1520.  
  1521.     
  1522.     def getInterface(self, feature):
  1523.         if self.hasFeature(feature, None):
  1524.             return self
  1525.         else:
  1526.             return None
  1527.  
  1528.     
  1529.     def _create_document(self):
  1530.         return Document()
  1531.  
  1532.  
  1533.  
  1534. class ElementInfo(object):
  1535.     __slots__ = ('tagName',)
  1536.     
  1537.     def __init__(self, name):
  1538.         self.tagName = name
  1539.  
  1540.     
  1541.     def getAttributeType(self, aname):
  1542.         return _no_type
  1543.  
  1544.     
  1545.     def getAttributeTypeNS(self, namespaceURI, localName):
  1546.         return _no_type
  1547.  
  1548.     
  1549.     def isElementContent(self):
  1550.         return False
  1551.  
  1552.     
  1553.     def isEmpty(self):
  1554.         return False
  1555.  
  1556.     
  1557.     def isId(self, aname):
  1558.         return False
  1559.  
  1560.     
  1561.     def isIdNS(self, namespaceURI, localName):
  1562.         return False
  1563.  
  1564.     
  1565.     def __getstate__(self):
  1566.         return self.tagName
  1567.  
  1568.     
  1569.     def __setstate__(self, state):
  1570.         self.tagName = state
  1571.  
  1572.  
  1573.  
  1574. def _clear_id_cache(node):
  1575.     if node.nodeType == Node.DOCUMENT_NODE:
  1576.         node._id_cache.clear()
  1577.         node._id_search_stack = None
  1578.     elif _in_document(node):
  1579.         node.ownerDocument._id_cache.clear()
  1580.         node.ownerDocument._id_search_stack = None
  1581.     
  1582.  
  1583.  
  1584. class Document(Node, DocumentLS):
  1585.     _child_node_types = (Node.ELEMENT_NODE, Node.PROCESSING_INSTRUCTION_NODE, Node.COMMENT_NODE, Node.DOCUMENT_TYPE_NODE)
  1586.     nodeType = Node.DOCUMENT_NODE
  1587.     nodeName = '#document'
  1588.     nodeValue = None
  1589.     attributes = None
  1590.     doctype = None
  1591.     parentNode = None
  1592.     previousSibling = None
  1593.     nextSibling = None
  1594.     implementation = DOMImplementation()
  1595.     actualEncoding = None
  1596.     encoding = None
  1597.     standalone = None
  1598.     version = None
  1599.     strictErrorChecking = False
  1600.     errorHandler = None
  1601.     documentURI = None
  1602.     _magic_id_count = 0
  1603.     
  1604.     def __init__(self):
  1605.         self.childNodes = NodeList()
  1606.         self._elem_info = { }
  1607.         self._id_cache = { }
  1608.         self._id_search_stack = None
  1609.  
  1610.     
  1611.     def _get_elem_info(self, element):
  1612.         if element.namespaceURI:
  1613.             key = (element.namespaceURI, element.localName)
  1614.         else:
  1615.             key = element.tagName
  1616.         return self._elem_info.get(key)
  1617.  
  1618.     
  1619.     def _get_actualEncoding(self):
  1620.         return self.actualEncoding
  1621.  
  1622.     
  1623.     def _get_doctype(self):
  1624.         return self.doctype
  1625.  
  1626.     
  1627.     def _get_documentURI(self):
  1628.         return self.documentURI
  1629.  
  1630.     
  1631.     def _get_encoding(self):
  1632.         return self.encoding
  1633.  
  1634.     
  1635.     def _get_errorHandler(self):
  1636.         return self.errorHandler
  1637.  
  1638.     
  1639.     def _get_standalone(self):
  1640.         return self.standalone
  1641.  
  1642.     
  1643.     def _get_strictErrorChecking(self):
  1644.         return self.strictErrorChecking
  1645.  
  1646.     
  1647.     def _get_version(self):
  1648.         return self.version
  1649.  
  1650.     
  1651.     def appendChild(self, node):
  1652.         if node.nodeType not in self._child_node_types:
  1653.             raise xml.dom.HierarchyRequestErr('%s cannot be child of %s' % (repr(node), repr(self)))
  1654.         
  1655.         if node.parentNode is not None:
  1656.             node.parentNode.removeChild(node)
  1657.         
  1658.         if node.nodeType == Node.ELEMENT_NODE and self._get_documentElement():
  1659.             raise xml.dom.HierarchyRequestErr('two document elements disallowed')
  1660.         
  1661.         return Node.appendChild(self, node)
  1662.  
  1663.     
  1664.     def removeChild(self, oldChild):
  1665.         
  1666.         try:
  1667.             self.childNodes.remove(oldChild)
  1668.         except ValueError:
  1669.             raise xml.dom.NotFoundErr()
  1670.  
  1671.         oldChild.nextSibling = None
  1672.         oldChild.previousSibling = None
  1673.         oldChild.parentNode = None
  1674.         if self.documentElement is oldChild:
  1675.             self.documentElement = None
  1676.         
  1677.         return oldChild
  1678.  
  1679.     
  1680.     def _get_documentElement(self):
  1681.         for node in self.childNodes:
  1682.             if node.nodeType == Node.ELEMENT_NODE:
  1683.                 return node
  1684.                 continue
  1685.         
  1686.  
  1687.     
  1688.     def unlink(self):
  1689.         if self.doctype is not None:
  1690.             self.doctype.unlink()
  1691.             self.doctype = None
  1692.         
  1693.         Node.unlink(self)
  1694.  
  1695.     
  1696.     def cloneNode(self, deep):
  1697.         if not deep:
  1698.             return None
  1699.         
  1700.         clone = self.implementation.createDocument(None, None, None)
  1701.         clone.encoding = self.encoding
  1702.         clone.standalone = self.standalone
  1703.         clone.version = self.version
  1704.         for n in self.childNodes:
  1705.             childclone = _clone_node(n, deep, clone)
  1706.             clone.childNodes.append(childclone)
  1707.             if childclone.nodeType == Node.DOCUMENT_NODE:
  1708.                 pass
  1709.             elif childclone.nodeType == Node.DOCUMENT_TYPE_NODE:
  1710.                 clone.doctype = childclone
  1711.             
  1712.             childclone.parentNode = clone
  1713.         
  1714.         self._call_user_data_handler(xml.dom.UserDataHandler.NODE_CLONED, self, clone)
  1715.         return clone
  1716.  
  1717.     
  1718.     def createDocumentFragment(self):
  1719.         d = DocumentFragment()
  1720.         d.ownerDocument = self
  1721.         return d
  1722.  
  1723.     
  1724.     def createElement(self, tagName):
  1725.         e = Element(tagName)
  1726.         e.ownerDocument = self
  1727.         return e
  1728.  
  1729.     
  1730.     def createTextNode(self, data):
  1731.         if not isinstance(data, StringTypes):
  1732.             raise TypeError, 'node contents must be a string'
  1733.         
  1734.         t = Text()
  1735.         t.data = data
  1736.         t.ownerDocument = self
  1737.         return t
  1738.  
  1739.     
  1740.     def createCDATASection(self, data):
  1741.         if not isinstance(data, StringTypes):
  1742.             raise TypeError, 'node contents must be a string'
  1743.         
  1744.         c = CDATASection()
  1745.         c.data = data
  1746.         c.ownerDocument = self
  1747.         return c
  1748.  
  1749.     
  1750.     def createComment(self, data):
  1751.         c = Comment(data)
  1752.         c.ownerDocument = self
  1753.         return c
  1754.  
  1755.     
  1756.     def createProcessingInstruction(self, target, data):
  1757.         p = ProcessingInstruction(target, data)
  1758.         p.ownerDocument = self
  1759.         return p
  1760.  
  1761.     
  1762.     def createAttribute(self, qName):
  1763.         a = Attr(qName)
  1764.         a.ownerDocument = self
  1765.         a.value = ''
  1766.         return a
  1767.  
  1768.     
  1769.     def createElementNS(self, namespaceURI, qualifiedName):
  1770.         (prefix, localName) = _nssplit(qualifiedName)
  1771.         e = Element(qualifiedName, namespaceURI, prefix)
  1772.         e.ownerDocument = self
  1773.         return e
  1774.  
  1775.     
  1776.     def createAttributeNS(self, namespaceURI, qualifiedName):
  1777.         (prefix, localName) = _nssplit(qualifiedName)
  1778.         a = Attr(qualifiedName, namespaceURI, localName, prefix)
  1779.         a.ownerDocument = self
  1780.         a.value = ''
  1781.         return a
  1782.  
  1783.     
  1784.     def _create_entity(self, name, publicId, systemId, notationName):
  1785.         e = Entity(name, publicId, systemId, notationName)
  1786.         e.ownerDocument = self
  1787.         return e
  1788.  
  1789.     
  1790.     def _create_notation(self, name, publicId, systemId):
  1791.         n = Notation(name, publicId, systemId)
  1792.         n.ownerDocument = self
  1793.         return n
  1794.  
  1795.     
  1796.     def getElementById(self, id):
  1797.         if self._id_cache.has_key(id):
  1798.             return self._id_cache[id]
  1799.         
  1800.         if not self._elem_info or self._magic_id_count:
  1801.             return None
  1802.         
  1803.         stack = self._id_search_stack
  1804.         if stack is None:
  1805.             stack = [
  1806.                 self.documentElement]
  1807.             self._id_search_stack = stack
  1808.         elif not stack:
  1809.             return None
  1810.         
  1811.         result = None
  1812.         for child in node.childNodes:
  1813.             if child.nodeType in _nodeTypes_with_children:
  1814.                 continue
  1815.             _[1][child]
  1816.             continue
  1817.             [](_[1])
  1818.             info = self._get_elem_info(node)
  1819.             if info:
  1820.                 for attr in node.attributes.values():
  1821.                     if attr.namespaceURI:
  1822.                         if info.isIdNS(attr.namespaceURI, attr.localName):
  1823.                             self._id_cache[attr.value] = node
  1824.                             if attr.value == id:
  1825.                                 result = node
  1826.                             elif not node._magic_id_nodes:
  1827.                                 break
  1828.                             
  1829.                         
  1830.                     info.isIdNS(attr.namespaceURI, attr.localName)
  1831.                     if info.isId(attr.name):
  1832.                         self._id_cache[attr.value] = node
  1833.                         if attr.value == id:
  1834.                             result = node
  1835.                         elif not node._magic_id_nodes:
  1836.                             break
  1837.                         
  1838.                     attr.value == id
  1839.                     if attr._is_id:
  1840.                         self._id_cache[attr.value] = node
  1841.                         if attr.value == id:
  1842.                             result = node
  1843.                         elif node._magic_id_nodes == 1:
  1844.                             break
  1845.                         
  1846.                     attr.value == id
  1847.                 
  1848.             elif node._magic_id_nodes:
  1849.                 for attr in node.attributes.values():
  1850.                     if attr._is_id:
  1851.                         self._id_cache[attr.value] = node
  1852.                         if attr.value == id:
  1853.                             result = node
  1854.                         
  1855.                     attr.value == id
  1856.                 
  1857.             
  1858.             if result is not None:
  1859.                 break
  1860.                 continue
  1861.         return result
  1862.  
  1863.     
  1864.     def getElementsByTagName(self, name):
  1865.         return _get_elements_by_tagName_helper(self, name, NodeList())
  1866.  
  1867.     
  1868.     def getElementsByTagNameNS(self, namespaceURI, localName):
  1869.         return _get_elements_by_tagName_ns_helper(self, namespaceURI, localName, NodeList())
  1870.  
  1871.     
  1872.     def isSupported(self, feature, version):
  1873.         return self.implementation.hasFeature(feature, version)
  1874.  
  1875.     
  1876.     def importNode(self, node, deep):
  1877.         if node.nodeType == Node.DOCUMENT_NODE:
  1878.             raise xml.dom.NotSupportedErr('cannot import document nodes')
  1879.         elif node.nodeType == Node.DOCUMENT_TYPE_NODE:
  1880.             raise xml.dom.NotSupportedErr('cannot import document type nodes')
  1881.         
  1882.         return _clone_node(node, deep, self)
  1883.  
  1884.     
  1885.     def writexml(self, writer, indent = '', addindent = '', newl = '', encoding = None):
  1886.         if encoding is None:
  1887.             writer.write('<?xml version="1.0" ?>' + newl)
  1888.         else:
  1889.             writer.write('<?xml version="1.0" encoding="%s"?>%s' % (encoding, newl))
  1890.         for node in self.childNodes:
  1891.             node.writexml(writer, indent, addindent, newl)
  1892.         
  1893.  
  1894.     
  1895.     def renameNode(self, n, namespaceURI, name):
  1896.         if n.ownerDocument is not self:
  1897.             raise xml.dom.WrongDocumentErr('cannot rename nodes from other documents;\nexpected %s,\nfound %s' % (self, n.ownerDocument))
  1898.         
  1899.         if n.nodeType not in (Node.ELEMENT_NODE, Node.ATTRIBUTE_NODE):
  1900.             raise xml.dom.NotSupportedErr('renameNode() only applies to element and attribute nodes')
  1901.         
  1902.         if namespaceURI != EMPTY_NAMESPACE:
  1903.             if ':' in name:
  1904.                 (prefix, localName) = name.split(':', 1)
  1905.                 if prefix == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE:
  1906.                     raise xml.dom.NamespaceErr("illegal use of 'xmlns' prefix")
  1907.                 
  1908.             elif name == 'xmlns' and namespaceURI != xml.dom.XMLNS_NAMESPACE and n.nodeType == Node.ATTRIBUTE_NODE:
  1909.                 raise xml.dom.NamespaceErr("illegal use of the 'xmlns' attribute")
  1910.             
  1911.             prefix = None
  1912.             localName = name
  1913.         else:
  1914.             prefix = None
  1915.             localName = None
  1916.         if n.nodeType == Node.ATTRIBUTE_NODE:
  1917.             element = n.ownerElement
  1918.             if element is not None:
  1919.                 is_id = n._is_id
  1920.                 element.removeAttributeNode(n)
  1921.             
  1922.         else:
  1923.             element = None
  1924.         d = n.__dict__
  1925.         d['prefix'] = prefix
  1926.         d['localName'] = localName
  1927.         d['namespaceURI'] = namespaceURI
  1928.         d['nodeName'] = name
  1929.         if n.nodeType == Node.ELEMENT_NODE:
  1930.             d['tagName'] = name
  1931.         else:
  1932.             d['name'] = name
  1933.             if element is not None:
  1934.                 element.setAttributeNode(n)
  1935.                 if is_id:
  1936.                     element.setIdAttributeNode(n)
  1937.                 
  1938.             
  1939.         return n
  1940.  
  1941.  
  1942. defproperty(Document, 'documentElement', doc = 'Top-level element of this document.')
  1943.  
  1944. def _clone_node(node, deep, newOwnerDocument):
  1945.     if node.ownerDocument.isSameNode(newOwnerDocument):
  1946.         operation = xml.dom.UserDataHandler.NODE_CLONED
  1947.     else:
  1948.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  1949.     if node.nodeType == Node.ELEMENT_NODE:
  1950.         clone = newOwnerDocument.createElementNS(node.namespaceURI, node.nodeName)
  1951.         for attr in node.attributes.values():
  1952.             clone.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value)
  1953.             a = clone.getAttributeNodeNS(attr.namespaceURI, attr.localName)
  1954.             a.specified = attr.specified
  1955.         
  1956.         if deep:
  1957.             for child in node.childNodes:
  1958.                 c = _clone_node(child, deep, newOwnerDocument)
  1959.                 clone.appendChild(c)
  1960.             
  1961.         
  1962.     elif node.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
  1963.         clone = newOwnerDocument.createDocumentFragment()
  1964.         if deep:
  1965.             for child in node.childNodes:
  1966.                 c = _clone_node(child, deep, newOwnerDocument)
  1967.                 clone.appendChild(c)
  1968.             
  1969.         
  1970.     elif node.nodeType == Node.TEXT_NODE:
  1971.         clone = newOwnerDocument.createTextNode(node.data)
  1972.     elif node.nodeType == Node.CDATA_SECTION_NODE:
  1973.         clone = newOwnerDocument.createCDATASection(node.data)
  1974.     elif node.nodeType == Node.PROCESSING_INSTRUCTION_NODE:
  1975.         clone = newOwnerDocument.createProcessingInstruction(node.target, node.data)
  1976.     elif node.nodeType == Node.COMMENT_NODE:
  1977.         clone = newOwnerDocument.createComment(node.data)
  1978.     elif node.nodeType == Node.ATTRIBUTE_NODE:
  1979.         clone = newOwnerDocument.createAttributeNS(node.namespaceURI, node.nodeName)
  1980.         clone.specified = True
  1981.         clone.value = node.value
  1982.     elif node.nodeType == Node.DOCUMENT_TYPE_NODE:
  1983.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  1984.         clone = newOwnerDocument.implementation.createDocumentType(node.name, node.publicId, node.systemId)
  1985.         clone.ownerDocument = newOwnerDocument
  1986.         if deep:
  1987.             clone.entities._seq = []
  1988.             clone.notations._seq = []
  1989.             for n in node.notations._seq:
  1990.                 notation = Notation(n.nodeName, n.publicId, n.systemId)
  1991.                 notation.ownerDocument = newOwnerDocument
  1992.                 clone.notations._seq.append(notation)
  1993.                 if hasattr(n, '_call_user_data_handler'):
  1994.                     n._call_user_data_handler(operation, n, notation)
  1995.                     continue
  1996.             
  1997.             for e in node.entities._seq:
  1998.                 entity = Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  1999.                 entity.actualEncoding = e.actualEncoding
  2000.                 entity.encoding = e.encoding
  2001.                 entity.version = e.version
  2002.                 entity.ownerDocument = newOwnerDocument
  2003.                 clone.entities._seq.append(entity)
  2004.                 if hasattr(e, '_call_user_data_handler'):
  2005.                     e._call_user_data_handler(operation, n, entity)
  2006.                     continue
  2007.             
  2008.         
  2009.     else:
  2010.         raise xml.dom.NotSupportedErr('Cannot clone node %s' % repr(node))
  2011.     if hasattr(node, '_call_user_data_handler'):
  2012.         node._call_user_data_handler(operation, node, clone)
  2013.     
  2014.     return clone
  2015.  
  2016.  
  2017. def _nssplit(qualifiedName):
  2018.     fields = qualifiedName.split(':', 1)
  2019.     if len(fields) == 2:
  2020.         return fields
  2021.     else:
  2022.         return (None, fields[0])
  2023.  
  2024.  
  2025. def _get_StringIO():
  2026.     StringIO = StringIO
  2027.     import StringIO
  2028.     return StringIO()
  2029.  
  2030.  
  2031. def _do_pulldom_parse(func, args, kwargs):
  2032.     events = func(*args, **kwargs)
  2033.     (toktype, rootNode) = events.getEvent()
  2034.     events.expandNode(rootNode)
  2035.     events.clear()
  2036.     return rootNode
  2037.  
  2038.  
  2039. def parse(file, parser = None, bufsize = None):
  2040.     if parser is None and not bufsize:
  2041.         expatbuilder = expatbuilder
  2042.         import xml.dom
  2043.         return expatbuilder.parse(file)
  2044.     else:
  2045.         pulldom = pulldom
  2046.         import xml.dom
  2047.         return _do_pulldom_parse(pulldom.parse, (file,), {
  2048.             'parser': parser,
  2049.             'bufsize': bufsize })
  2050.  
  2051.  
  2052. def parseString(string, parser = None):
  2053.     if parser is None:
  2054.         expatbuilder = expatbuilder
  2055.         import xml.dom
  2056.         return expatbuilder.parseString(string)
  2057.     else:
  2058.         pulldom = pulldom
  2059.         import xml.dom
  2060.         return _do_pulldom_parse(pulldom.parseString, (string,), {
  2061.             'parser': parser })
  2062.  
  2063.  
  2064. def getDOMImplementation(features = None):
  2065.     if features:
  2066.         if isinstance(features, StringTypes):
  2067.             features = domreg._parse_feature_string(features)
  2068.         
  2069.         for f, v in features:
  2070.             if not Document.implementation.hasFeature(f, v):
  2071.                 return None
  2072.                 continue
  2073.         
  2074.     
  2075.     return Document.implementation
  2076.  
  2077.